package com.juc.concurrency.jucExample.frokJoin;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;
import java.util.concurrent.RecursiveTask;

/**
 * 斐波拉契数列
 * 1、1、2、3、5、8、13、21、34、…… 公式 ：F(1)=1，F(2)=1, F(n)=F(n-1)+F(n-2)（n>=3，n∈N*）
 */
public class ForkJoinFibonacciExample3 {

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ForkJoinPool pool = new ForkJoinPool();
        Future<Integer> future = pool.submit(new Fibonacci(9));
        System.out.println(future.get());
        pool.shutdown();
    }

    private static class Fibonacci extends RecursiveTask<Integer> {
        
        final int n;

        Fibonacci(int n) {
            this.n = n;
        }

        @Override
        protected Integer compute() {
            if (n <= 1) {
                return n;
            }
            Fibonacci f1 = new Fibonacci(n - 1);
            //创建⼦任务
            f1.fork();
            Fibonacci f2 = new Fibonacci(n - 2);
            //等待子任务结果,并合并结果.
            return f2.compute() + f1.join();
        }
    }

}
